package com.bluefox.uac.utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;


/**
 * 加解密工具
 * @author SunFeng
 */
public class EncryptUtil {
    /**
     * @param content 原文
     * @param key 加密密钥
     * @Description: AES字符串加密<br/>
     * @Return: String 加密后字符串<br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:35:50 <br/>
     */
    public static String aesEncryptToString(final String content, final String key) {
        try {
            return EncryptUtil.parseByte2HexStr(EncryptUtil.aesEncryptToBytes(content, key)).toString();
        } catch (final Exception e) {
            return null;
        }
    }

    /**
     * @param content 秘文
     * @param key 密钥
     * @return 原文<br/>
     * @Description: AES字符串解密方法<br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:39:05 <br/>
     */
    public static String aesDecryptByString(final String content, final String key) {
        try {
            return EncryptUtil.aesDecryptByBytes(EncryptUtil.parseHexStr2Byte(content), key);
        } catch (final Exception e) {
            return null;
        }
    }

    /**
     * @param buf 待转换byte数组
     * @return 十六进制字符串<br/>
     * @Description: 二进制转十六进制数据<br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:40:36 <br/>
     */
    public static String parseByte2HexStr(final byte buf[]) {
        final StringBuffer sb = new StringBuffer();
        for (final byte element : buf) {
            String hex = Integer.toHexString(element & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * @param hexStr 十六进制字符串
     * @return 二进制byte数组<br/>
     * @Description: 十六进制转二进制<br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:41:49 <br/>
     */
    public static byte[] parseHexStr2Byte(final String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        final byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < (hexStr.length() / 2); i++) {
            final int high = Integer.parseInt(hexStr.substring(i * 2, (i * 2) + 1), 16);
            final int low = Integer.parseInt(hexStr.substring((i * 2) + 1, (i * 2) + 2), 16);
            result[i] = (byte) ((high * 16) + low);
        }
        return result;
    }

    /**
     * @param content 原文
     * @param encryptKey 密钥
     * @return 加密byte数组
     * @throws Exception <br/>
     * @Description: 字符串AES加密 <br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:42:46 <br/>
     */
    public static byte[] aesEncryptToBytes(final String content, final String encryptKey) throws Exception {
        final KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, new SecureRandom(encryptKey.getBytes()));

        final Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));

        return cipher.doFinal(content.getBytes("utf-8"));
    }

    /**
     * @param args <br/>
     * @Description: 测试方法 <br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:43:47 <br/>
     */
    public static void main(final String[] args) {
        System.out.println(EncryptUtil.aesEncryptToString("15841124142", "e9djk478fglw9c12"));
        System.out.println(EncryptUtil.aesDecryptByString("1AF43C5862D695EACEFEE62BC919360A", "t9dx13of30x6od1hpw"));

    }

    /**
     * @param encryptBytes 密文byte数组
     * @param decryptKey 密钥
     * @return 原文
     * @throws Exception <br/>
     * @Description: AES解密 <br/>
     * @Author: 许天骄 <br/>
     * @Date: 2018年9月17日 下午8:44:10 <br/>
     */
    public static String aesDecryptByBytes(final byte[] encryptBytes, final String decryptKey) throws Exception {
        final KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128, new SecureRandom(decryptKey.getBytes()));

        final Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));
        final byte[] decryptBytes = cipher.doFinal(encryptBytes);

        return new String(decryptBytes);
    }

}
